// type inference 类型推论
let str = 'str'

// union types 联合类型
let numberOrString: number | string
numberOrString = 'abc'
numberOrString = 123
// 联合类型只能访问共有的属性和方法
numberOrString.toString()
// numberOrString.length


// 类型断言
// 因为 input 不确定为 number 还是 string, 用 as 断言 input 为 string 类型，来使用string类型的length属性
function getLength(input: string | number): number {
    const str = input as string
    if(str.length){
        return str.length
    } else {
        const number = input as number
        return number.toString().length

    }
}

// type guard 类型守卫
function getLength2(input: string | number): number {
    // 使用 typeof , instanceof 来进行类型判断的条件分支中， ts 会自动缩小类型范围
    if(typeof input === 'string'){
        return input.length
    } else {
        return input.toString().length
    }
}
